/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package managers;

import catalogos.ExtraccionCatalogos;
import conexionBD.ConexionServidor;
import java.io.Serializable;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.jsp.jstl.sql.Result;
import javax.servlet.jsp.jstl.sql.ResultSupport;

/**
 *
 * @author Jose
 */
@ManagedBean
@SessionScoped
public class managerGestionUsuario implements Serializable {

    private String primernombre;
    private String segundonombre;
    private String primerapellido;
    private String segundoapellido;
    private Integer dui;
    private String email;
    private String nombreusuario;
    private String estadousuario;
    private int perfilSeleccionado;
    private int usuarioSeleccionado;
    private String expedienteIntroducido;
    private int nuevoUsuarioSeleccionado;
    private String perfil;
    private int estadoSeleccionado;
    private ExtraccionCatalogos catalogoActual = new ExtraccionCatalogos();
    FacesContext context;

    /** Creates a new instance of managerGestionUsuario */
    public managerGestionUsuario() {
    }

    public Integer getDui() {
        return dui;
    }

    public void setDui(Integer dui) {
        this.dui = dui;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getEstadousuario() {
        return estadousuario;
    }

    public void setEstadousuario(String estadousuario) {
        this.estadousuario = estadousuario;
    }

    public String getNombreusuario() {
        return nombreusuario;
    }

    public void setNombreusuario(String nombreusuario) {
        this.nombreusuario = nombreusuario;
    }

    public int getPerfilSeleccionado() {
        return perfilSeleccionado;
    }

    public void setPerfilSeleccionado(int perfilSeleccionado) {
        this.perfilSeleccionado = perfilSeleccionado;
    }

    public String getPrimerapellido() {
        return primerapellido;
    }

    public void setPrimerapellido(String primerapellido) {
        this.primerapellido = primerapellido;
    }

    public String getPrimernombre() {
        return primernombre;
    }

    public void setPrimernombre(String primernombre) {
        this.primernombre = primernombre;
    }

    public String getSegundoapellido() {
        return segundoapellido;
    }

    public void setSegundoapellido(String segundoapellido) {
        this.segundoapellido = segundoapellido;
    }

    public String getSegundonombre() {
        return segundonombre;
    }

    public void setSegundonombre(String segundonombre) {
        this.segundonombre = segundonombre;
    }

    public int getUsuarioSeleccionado() {
        return usuarioSeleccionado;
    }

    public void setUsuarioSeleccionado(int usuarioSeleccionado) {
        this.usuarioSeleccionado = usuarioSeleccionado;
    }

    public String getExpedienteIntroducido() {
        return expedienteIntroducido;
    }

    public void setExpedienteIntroducido(String expedienteIntroducido) {
        this.expedienteIntroducido = expedienteIntroducido;
    }

    public int getNuevoUsuarioSeleccionado() {
        return nuevoUsuarioSeleccionado;
    }

    public void setNuevoUsuarioSeleccionado(int nuevoUsuarioSeleccionado) {
        this.nuevoUsuarioSeleccionado = nuevoUsuarioSeleccionado;
    }

    public ExtraccionCatalogos getCatalogoActual() {
        return catalogoActual;
    }

    public void setCatalogoActual(ExtraccionCatalogos catalogoActual) {
        this.catalogoActual = catalogoActual;
    }

    public String getPerfil() {
        return perfil;
    }

    public void setPerfil(String perfil) {
        this.perfil = perfil;
    }

    public int getEstadoSeleccionado() {
        return estadoSeleccionado;
    }

    public void setEstadoSeleccionado(int estadoSeleccionado) {
        this.estadoSeleccionado = estadoSeleccionado;
    }

    public void buscarUsuario() {
        ConexionServidor miConexion = new ConexionServidor();
        try {
            Connection con = miConexion.getConnection();
            PreparedStatement ps = con.prepareStatement("SELECT * FROM usuario WHERE idusuario = ?");
            ps.setInt(1, usuarioSeleccionado);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                //Extraccion la resolucion de solicitante
                primernombre = rs.getString("primernombreusuario");
                segundonombre = rs.getString("segundonombreusuario");
                primerapellido = rs.getString("primerapellidousuario");
                segundoapellido = rs.getString("segundoapellidousuario");
                nombreusuario = rs.getString("nombreusuario");
                dui = rs.getInt("duiusuario");
                email = rs.getString("emailusuario");
                if (rs.getBoolean("estadousuario") == true) {
                    estadousuario = "ACTIVO";
                } else {
                    estadousuario = "INACTIVO";
                }
            }
            if (nombreusuario != null) {
                context = FacesContext.getCurrentInstance();
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "RECUPERACI&Oacute;N DE INFORMACI&Oacute;N", "La informacion fue recuperada con exito"));
            } else {
                context = FacesContext.getCurrentInstance();
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "RECUPERACI&Oacute;N DE INFORMACI&Oacute;N", "Seleccione un usuario válido"));
            }
            rs.close();
            ps.close();
            con.close();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }

    public void guardarInformacionUsuario() {
        ConexionServidor myConexion = new ConexionServidor();
        try {
            Connection con = myConexion.getConnection();
            //Sentencia sql que hace el llamado a el procedimiento
//            String sql0 = "{call usertemp (?,?)}";
//            CallableStatement cs0 = con.prepareCall(sql0);
//            cs0.setString(1, numeroExpediente);
//            cs0.setString(2, extContext.getUserPrincipal().getName().toString());
//            cs0.execute();
            String sql = "{call modificarusuario(?,?,?,?,?,?,?,?)}";
            CallableStatement cs = con.prepareCall(sql);
            //Setting los parametros a ser captorados or el proceso almacenado
            cs.setInt(1, usuarioSeleccionado);
            cs.setString(2, primernombre);
            cs.setString(3, segundonombre);
            cs.setString(4, primerapellido);
            cs.setString(5, segundoapellido);
            cs.setString(6, nombreusuario);
            cs.setInt(7, dui);
            cs.setString(8, email);
            //ejecucion del proceso almacenado
            cs.execute();
            //Mensaje de actualizacion exitosa
            context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "ACTUALIZACI&Oacute;N", "La información fue actualizada con exito"));
            //cierre de CallableStatement y Connection
//            cs0.close();
            cs.close();
            con.close();
        } catch (Exception e) {
            context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "ACTUALIZACI&Oacute;N", "La información no fue actualizada"));
            System.out.println(e.getMessage());
        }
    }

    public List<SelectItem> getListaUsuariosDisponibles() {
        ConexionServidor myConexion = new ConexionServidor();
        List<SelectItem> usuario = new ArrayList<SelectItem>();
        usuario.add(new SelectItem(0, "-seleccione uno-"));
        try {
            Connection con = myConexion.getConnection();
            PreparedStatement ps = con.prepareCall("SELECT usuario.idusuario, usuario.nombreusuario FROM usuario, perfil_miembro, perfil WHERE usuario.idusuario = perfil_miembro.idusuario AND perfil.idperfil = perfil_miembro.idperfil AND perfil.nombreperfil = 'TECNICO' AND usuario.idusuario != ? AND usuario.estadousuario = true");
            ps.setInt(1, usuarioSeleccionado);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                usuario.add(new SelectItem(rs.getInt("idusuario"), rs.getString("nombreusuario")));
            }
            rs.close();
            ps.close();
            con.close();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
        return usuario;
    }

    public Result getListaExpedientes() throws Exception {
        ConexionServidor miConexion = new ConexionServidor();
        Connection conn = miConexion.getConnection();
        buscarPerfiles();
        try {
            if ("TECNICO".equals(perfil)) {
                PreparedStatement ps = conn.prepareStatement("select idexpediente from expediente where idusuario = ?");
                ps.setInt(1, usuarioSeleccionado);
                ResultSet rs = ps.executeQuery();
                return ResultSupport.toResult(rs);
            }
            return null;
        } finally {
            conn.close();
        }
    }

    public void buscarPerfiles(){
    ConexionServidor myConexion = new ConexionServidor();
        try {
            Connection con = myConexion.getConnection();
            PreparedStatement ps = con.prepareStatement("SELECT perfil.nombreperfil FROM perfil, usuario, perfil_miembro WHERE perfil.idperfil = perfil_miembro.idperfil AND usuario.idusuario = perfil_miembro.idusuario AND usuario.idusuario = ?");
            ps.setInt(1, usuarioSeleccionado);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
              perfil  = rs.getString("nombreperfil");
            }
            rs.close();
            ps.close();
            con.close();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }

    public void guardarReasignacionTecnico() {
        ConexionServidor myConexion = new ConexionServidor();
        try {
            Connection con = myConexion.getConnection();
            //Sentencia sql que hace el llamado a el procedimiento
//            String sql0 = "{call usertemp (?,?)}";
//            CallableStatement cs0 = con.prepareCall(sql0);
//            cs0.setString(1, numeroExpediente);
//            cs0.setString(2, extContext.getUserPrincipal().getName().toString());
//            cs0.execute();
            String sql = "{call reasignar(?,?)}";
            CallableStatement cs = con.prepareCall(sql);
            //Setting los parametros a ser captorados or el proceso almacenado
            cs.setString(1, expedienteIntroducido);
            cs.setInt(2, nuevoUsuarioSeleccionado);
            //ejecucion del proceso almacenado
            cs.execute();
            //Mensaje de actualizacion exitosa
            context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "ACTUALIZACI&Oacute;N", "La información fue actualizada con exito"));
            //cierre de CallableStatement y Connection
//            cs0.close();
            cs.close();
            con.close();
        } catch (Exception e) {
            context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "ACTUALIZACI&Oacute;N", "La información no fue actualizada"));
            System.out.println(e.getMessage());
        }
    }

    public void guardarCambioPerfil() {
        ConexionServidor myConexion = new ConexionServidor();
        try {
            Connection con = myConexion.getConnection();
            //Sentencia sql que hace el llamado a el procedimiento
//            String sql0 = "{call usertemp (?,?)}";
//            CallableStatement cs0 = con.prepareCall(sql0);
//            cs0.setString(1, numeroExpediente);
//            cs0.setString(2, extContext.getUserPrincipal().getName().toString());
//            cs0.execute();
            String sql = "{call cambiarperfil(?,?)}";
            CallableStatement cs = con.prepareCall(sql);
            //Setting los parametros a ser captorados or el proceso almacenado
            cs.setInt(1, perfilSeleccionado);
            cs.setInt(2, usuarioSeleccionado);
            //ejecucion del proceso almacenado
            cs.execute();
            //Mensaje de actualizacion exitosa
            context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "ACTUALIZACI&Oacute;N", "La información fue actualizada con exito"));
            //cierre de CallableStatement y Connection
//            cs0.close();
            cs.close();
            con.close();
        } catch (Exception e) {
            context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "ACTUALIZACI&Oacute;N", "La información no fue actualizada"));
            System.out.println(e.getMessage());
        }
    }

        public void guardarCambioEstadoInactivo() {
        ConexionServidor myConexion = new ConexionServidor();
        try {
            Connection con = myConexion.getConnection();
            //Sentencia sql que hace el llamado a el procedimiento
//            String sql0 = "{call usertemp (?,?)}";
//            CallableStatement cs0 = con.prepareCall(sql0);
//            cs0.setString(1, numeroExpediente);
//            cs0.setString(2, extContext.getUserPrincipal().getName().toString());
//            cs0.execute();
            String sql = "{call cambiarestado(?,?)}";
            CallableStatement cs = con.prepareCall(sql);
            //Setting los parametros a ser captorados or el proceso almacenado
            cs.setInt(1, 2);
            cs.setInt(2, usuarioSeleccionado);
            //ejecucion del proceso almacenado
            cs.execute();
            //Mensaje de actualizacion exitosa
            context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "ACTUALIZACI&Oacute;N", "La información fue actualizada con exito"));
            //cierre de CallableStatement y Connection
//            cs0.close();
            cs.close();
            con.close();
        } catch (Exception e) {
            context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "ACTUALIZACI&Oacute;N", "La información no fue actualizada"));
            System.out.println(e.getMessage());
        }
    }

        public void guardarCambioEstadoActivo() {
        ConexionServidor myConexion = new ConexionServidor();
        try {
            Connection con = myConexion.getConnection();
            //Sentencia sql que hace el llamado a el procedimiento
//            String sql0 = "{call usertemp (?,?)}";
//            CallableStatement cs0 = con.prepareCall(sql0);
//            cs0.setString(1, numeroExpediente);
//            cs0.setString(2, extContext.getUserPrincipal().getName().toString());
//            cs0.execute();
            String sql = "{call cambiarestado(?,?)}";
            CallableStatement cs = con.prepareCall(sql);
            //Setting los parametros a ser captorados or el proceso almacenado
            cs.setInt(1, 1);
            cs.setInt(2, usuarioSeleccionado);
            //ejecucion del proceso almacenado
            cs.execute();
            //Mensaje de actualizacion exitosa
            context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "ACTUALIZACI&Oacute;N", "La información fue actualizada con exito"));
            //cierre de CallableStatement y Connection
//            cs0.close();
            cs.close();
            con.close();
        } catch (Exception e) {
            context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "ACTUALIZACI&Oacute;N", "La información no fue actualizada"));
            System.out.println(e.getMessage());
        }
    }

}
